﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ibba.agil.core.common;


namespace ibba.agil.core
{
    /// <summary>
    /// Use 0 para inserir um novo registro no Banco de Dados
    /// Use 1 para atualizar um registro já existente
    /// </summary>
    public enum EntityState
    {
        Created = 0, 
        Materialized = 1
    }

    public abstract class EntityData
    {
        /// <summary>
        /// Controla o estado do objeto para criaçao ou atualização
        /// </summary>
        private EntityState _state = EntityState.Created;

        
    
        /// <summary>
        /// Apenas adiciona a entidade no Contexto [DB], e commita as alterações 
        /// </summary>
        public abstract void Save();

        /// <summary>
        /// Apenas adiciona a entidade no Contexto [DB], 
        /// </summary>
        public abstract void Save(TransactionManager transactionContext);
        
        /// <summary>
        /// Apenas remove a entidade no Contexto [DB], e commita as alterações 
        /// </summary>
        public abstract void Delete();
        
        /// <summary>
        /// Apenas remove a entidade no Contexto [DB], 
        /// </summary>
        public abstract void Delete(TransactionManager transactionContext);
             
        /// <summary>
        /// propriedade de mapeamento entre tabela do *DataBase* e *Entitade*
        /// </summary>
        protected internal Dictionary<string, string> MapperTable { get; set; }

        /// <summary>
        /// Propriedade de mapeamento entre *coluna do tabela* e *propriedade da entidade*
        /// </summary>
        protected internal  Dictionary<string, string> Mapper { get; set; }

        /// <summary>
        /// Propriedade de mapeamento entre *chaves da tabela* necessarias para materialização e *propriedade da tabela*
        /// </summary>
        protected internal Dictionary<string, string> MapperKeys { get; set; }

        /// <summary>
        /// Propriedade de controle de chave primaria identity
        /// </summary>
        protected internal bool MapperKeyIsNotIdentity { get; set; }
        
    }
}
